package v1

import (
	. "gintify/core"
	"gintify/model"
	"gintify/response"
	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
	"strconv"
)

type IMenuController interface {
	IRestController
}

type MenuController struct {
	//空结构体
}

func isMenuExist(name string) bool {
	var menu model.SysMenu
	DB.Debug().Where("name = ?", name).First(&menu)
	return menu.ID != 0
}

// @Summary 新增菜单
// @Description 在数据库中新增菜单信息
// @Tags 菜单
// @Accept  json
// @Produce  json
// @Security ApiKeyAuth
// @Success 200 {object} []model.SysMenu "{"code":0,"msg":"OK","data": {}}"
// @Router /api/v1/menus [post]
func (m MenuController) Post(c *gin.Context) {
	var menu = model.SysMenu{}
	if err := c.ShouldBindJSON(&menu); err != nil {
		response.Error(c, "绑定错误", err)
		return
	}
	if menu.Name == "" || menu.Path == "" || menu.Title == "" {
		response.Error(c, "不允许创建一个空记录", nil)
		return
	}

	if isMenuExist(menu.Name) {
		response.Fail(c, "菜单名已被占用", nil)
		return
	}
	if err := DB.Create(&menu).Error; err != nil {
		response.Error(c, "创建失败", err)
		return
	}
	response.Success(c, "新建菜单成功", menu)

}

// @Summary 获取菜单
// @Description 在数据库中获取菜单信息
// @Tags 菜单
// @Accept  json
// @Produce  json
// @Security ApiKeyAuth
// @Success 200 {object} []model.SysMenu "{"code":0,"msg":"OK","data": {}}"
// @Router /api/v1/menus [get]
func (m MenuController) GetList(c *gin.Context) {
	var menus []model.SysMenu

	claims, _ := c.Get("user")
	user := claims.(model.SysUser)
	var db *gorm.DB
	if user.RoleID != 1 {
		db = DB
	} else {
		db = DB
	}

	if err := db.Debug().Find(&menus).Error; err != nil {
		response.Error(c, "查询失败", err)
		return
	}
	if len(menus) == 0 {
		response.Success(c, "菜单列表为空", nil)
		return
	}
	response.Success(c, "获取菜单列表成功", menus)
}

// @Summary 获取菜单
// @Description 在数据库中获取菜单信息
// @Tags 菜单
// @Accept  json
// @Produce  json
// @Security ApiKeyAuth
// @Param id path uint64 true "menu id in database"
// @Success 200 {object} model.SysMenu "{"code":0,"msg":"OK","data": {}}"
// @Router /api/v1/menus/{id} [get]
func (m MenuController) Get(c *gin.Context) {
	var menu model.SysMenu
	ids := c.Param("id")
	idx, err := strconv.Atoi(ids)
	if err != nil || idx < 1 {
		response.Fail(c, "URL路径有错误", err)
		return
	}

	if err := DB.Debug().First(&menu, idx).Error; err != nil {
		response.Error(c, "查询失败", err)
		return
	}
	if menu.ID == 0 {
		response.Fail(c, "菜单不存在", nil)
		return
	}
	response.Success(c, "获取菜单信息成功", menu)

}

// @Summary 更新菜单
// @Description 在数据库中更新菜单信息
// @Tags 菜单
// @Accept  json
// @Produce  json
// @Security ApiKeyAuth
// @Param id path uint64 true "menu id in database"
// @Success 200 {object} model.SysMenu "{"code":0,"msg":"OK","data": {}}"
// @Router /api/v1/menus/{id} [put]
func (m MenuController) Put(c *gin.Context) {
	ids := c.Param("id")
	idx, err := strconv.Atoi(ids)
	if err != nil || idx < 1 {
		response.Fail(c, "URL路径有错误", err)
		return
	}
	var menu = model.SysMenu{}
	if err := c.ShouldBindJSON(&menu); err != nil {
		response.Error(c, "绑定错误", nil)
		LG.Errorf("绑定出错%v\n", err)
		return
	}
	if menu.Name == "" || menu.Path == "" || menu.Title == "" {
		response.Error(c, "不允许更新为一个空记录", nil)
		return
	}

	if err := DB.Model(&model.SysMenu{}).Where("id = ?", idx).Updates(&menu).Error; err != nil {
		response.Error(c, "更新失败", err)
		return
	}
	response.Updated(c, "更新菜单信息成功", nil)
}

// @Summary 更新菜单
// @Description 在数据库中更新菜单信息
// @Tags 菜单
// @Accept  json
// @Produce  json
// @Security ApiKeyAuth
// @Param id path uint64 true "menu id in database"
// @Success 200 {object} model.SysMenu "{"code":0,"msg":"OK","data": {}}"
// @Router /api/v1/menus/{id} [patch]
func (m MenuController) Patch(c *gin.Context) {
	panic("implement me")
}

// @Summary 删除菜单
// @Description 在数据库中删除菜单信息
// @Tags 菜单
// @Accept  json
// @Produce  json
// @Security ApiKeyAuth
// @Param id path uint64 true "menu id in database"
// @Success 200 {object} model.SysMenu "{"code":0,"msg":"OK","data": {}}"
// @Router /api/v1/menus/{id} [delete]
func (m MenuController) Delete(c *gin.Context) {
	ids := c.Param("id")
	idx, err := strconv.Atoi(ids)
	if err != nil || idx < 1 {
		response.Fail(c, "URL路径有错误", err)
		return
	}
	if DB.Where("parent_id = ?", idx).First(&model.SysMenu{}).RowsAffected > 0 {
		response.Error(c, "删除失败,该菜单拥有子菜单，无法直接删除", err)
		return
	}
	if err := DB.Debug().Delete(&model.SysMenu{}, idx).Error; err != nil {
		response.Error(c, "删除失败", err)
		return
	}
	response.Deleted(c, "删除成功", nil)
}

func NewMenuController() *MenuController {
	DB.AutoMigrate(&model.SysMenu{})
	return &MenuController{}
}
